package org.hfy.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.hfy.entity.Outbound;
import org.hfy.mapper.OutboundMapper;
import org.hfy.service.OutboundDeliveryService;
import org.hfy.utils.HtmlToPdfUtils;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 出库送货单服务实现类
 * 
 * @author hfy
 * @version 1.0
 */
@Slf4j
@Service
public class OutboundDeliveryServiceImpl implements OutboundDeliveryService {

    @Autowired
    private OutboundMapper outboundMapper;

    @Override
    public byte[] generateDeliveryNotePdf(Outbound outbound) {
        try {
            // 读取送货单模板
            String templateContent = loadTemplate();
            
            // 填充模板数据
            String filledContent = fillTemplateData(templateContent, outbound);
            
            // 转换为PDF（使用送货单专用方法）
            return HtmlToPdfUtils.convertDeliveryNoteHtmlToPdf(filledContent);
            
        } catch (Exception e) {
            log.error("生成送货单PDF失败: outboundId={}, error={}", outbound.getId(), e.getMessage(), e);
            throw new RuntimeException("生成送货单PDF失败: " + e.getMessage());
        }
    }

    @Override
    public String generateDeliveryNoteHtml(Outbound outbound) {
        try {
            // 读取送货单模板
            String templateContent = loadTemplate();
            
            // 填充模板数据
            String filledContent = fillTemplateData(templateContent, outbound);
            
            return filledContent;
            
        } catch (Exception e) {
            log.error("生成送货单HTML失败: outboundId={}, error={}", outbound.getId(), e.getMessage(), e);
            throw new RuntimeException("生成送货单HTML失败: " + e.getMessage());
        }
    }

    /**
     * 加载送货单模板
     */
    private String loadTemplate() throws IOException {
        try (InputStream inputStream = getClass().getClassLoader()
                .getResourceAsStream("templates/outbound_temp_new.html")) {
            
            if (inputStream == null) {
                throw new IOException("送货单模板文件不存在: templates/outbound_temp_new.html");
            }
            
            Scanner scanner = new Scanner(inputStream, StandardCharsets.UTF_8.name()).useDelimiter("\\A");
            return scanner.hasNext() ? scanner.next() : "";
        }
    }

    /**
     * 填充模板数据
     */
    private String fillTemplateData(String template, Outbound outbound) {
        // 基础信息替换
        template = template.replace("${客户名称}", 
            outbound.getCustomerName() != null ? outbound.getCustomerName() : "");
        template = template.replace("${送货单号}", 
            generateDeliveryNo(outbound));
        template = template.replace("${送货日期}", 
            outbound.getOutboundDate() != null ? 
                outbound.getOutboundDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) : "");
        template = template.replace("${当前日期}", 
            LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")));

        // 生成物料详情行
        String materialRows = generateMaterialRows(outbound);
        template = template.replace("${出库物料详情行}", materialRows);

        return template;
    }

    /**
     * 生成送货单号
     */
    private String generateDeliveryNo(Outbound outbound) {
        // 使用出库单号作为送货单号，或者生成新的编号规则
        if (outbound.getOutboundNo() != null) {
            return "SH" + outbound.getOutboundNo().substring(2); // CK开头改为SH开头
        }
        return "SH" + System.currentTimeMillis();
    }

    /**
     * 生成物料详情行
     */
    private String generateMaterialRows(Outbound outbound) {
        StringBuilder rows = new StringBuilder();
        
        // 添加当前出库单记录
        rows.append("<tr>")
            .append("<td>1</td>")
            .append("<td>").append(outbound.getOutboundNo() != null ? outbound.getOutboundNo() : "").append("</td>")
            .append("<td>").append(outbound.getMaterialCode() != null ? outbound.getMaterialCode() : "").append("</td>")
            .append("<td>").append(outbound.getProductName() != null ? outbound.getProductName() : "").append("</td>")
            .append("<td>PCS</td>")
            .append("<td>").append(outbound.getOrderQuantity() != null ? outbound.getOrderQuantity() : 0).append("</td>")
            .append("<td>").append(outbound.getOutboundQuantity() != null ? outbound.getOutboundQuantity() : 0).append("</td>");
        
        // 计算欠数
        int shortage = 0;
        if (outbound.getOrderQuantity() != null && outbound.getOutboundQuantity() != null) {
            shortage = outbound.getOrderQuantity() - outbound.getOutboundQuantity();
            if (shortage < 0) shortage = 0;
        }
        
        rows.append("<td>").append(shortage).append("</td>")
            .append("<td>").append(outbound.getSpareQuantity() != null ? outbound.getSpareQuantity() : 0).append("</td>")
            .append("<td>").append(outbound.getRemark() != null ? outbound.getRemark() : "").append("</td>")
            .append("</tr>");

        // 查询同一客户的其他出库记录（可选，用于汇总送货单）
        List<Outbound> relatedOutbounds = getRelatedOutbounds(outbound);
        int rowIndex = 2;
        for (Outbound related : relatedOutbounds) {
            if (!related.getId().equals(outbound.getId())) {
                rows.append("<tr>")
                    .append("<td>").append(rowIndex++).append("</td>")
                    .append("<td>").append(related.getOutboundNo() != null ? related.getOutboundNo() : "").append("</td>")
                    .append("<td>").append(related.getMaterialCode() != null ? related.getMaterialCode() : "").append("</td>")
                    .append("<td>").append(related.getProductName() != null ? related.getProductName() : "").append("</td>")
                    .append("<td>PCS</td>")
                    .append("<td>").append(related.getOrderQuantity() != null ? related.getOrderQuantity() : 0).append("</td>")
                    .append("<td>").append(related.getOutboundQuantity() != null ? related.getOutboundQuantity() : 0).append("</td>");
                
                int relatedShortage = 0;
                if (related.getOrderQuantity() != null && related.getOutboundQuantity() != null) {
                    relatedShortage = related.getOrderQuantity() - related.getOutboundQuantity();
                    if (relatedShortage < 0) relatedShortage = 0;
                }
                
                rows.append("<td>").append(relatedShortage).append("</td>")
                    .append("<td>").append(related.getSpareQuantity() != null ? related.getSpareQuantity() : 0).append("</td>")
                    .append("<td>").append(related.getRemark() != null ? related.getRemark() : "").append("</td>")
                    .append("</tr>");
            }
        }

        // 添加空白行（限制最多显示5行）
        int maxRows = 5;
        for (int i = rowIndex; i <= maxRows; i++) {
            rows.append("<tr>")
                .append("<td>").append(i).append("</td>")
                .append("<td></td>")
                .append("<td></td>")
                .append("<td></td>")
                .append("<td></td>")
                .append("<td></td>")
                .append("<td></td>")
                .append("<td></td>")
                .append("<td></td>")
                .append("<td></td>")
                .append("</tr>");
        }

        return rows.toString();
    }

    /**
     * 获取相关的出库记录（同一客户同一天的出库记录）
     */
    private List<Outbound> getRelatedOutbounds(Outbound outbound) {
        try {
            // 这里可以根据业务需求查询相关出库记录
            // 例如：同一客户、同一出库日期的其他出库记录
            // 暂时返回空列表，后续可以根据需要实现查询逻辑
            return new ArrayList<>();
        } catch (Exception e) {
            log.warn("查询相关出库记录失败: {}", e.getMessage());
            return new ArrayList<>(); // 返回空列表
        }
    }
} 